package org.example.Thread.B_Thread;

/**
 * @className: StaticProxy
 * @author: 芃
 * @description: 静态代理
 * @date: 2024/5/13 12:16
 */
/*
 * 真实对象和代理对象都要实现同一个接口
 * 代理对象要代理真实对象，代理对象执行真实对象的核心功能
 * 其他辅助功能由代理对象帮助真实对象完成
 * （真实对象也可以自己去搞，但是为了保证类的单一性职责，所以提出代理对象的概念）
 */
interface Marry{
    void HappyMarry();
}
//真实角色
class You implements Marry{
    @Override
    public void HappyMarry(){
        System.out.println("我结婚了!");
    }
}
//代理角色
class WweddingCompany implements Marry{
    //代理谁-》真实对象
    private Marry target_marry;

    public WweddingCompany(Marry target_marry) {
        this.target_marry = target_marry;
    }

    @Override
    public void HappyMarry() {
        before();
        target_marry.HappyMarry();//这是真实对象的结婚过程
        after();
    }

    private void before(){
        System.out.println("Wishing you a happy marriage!");
        System.out.println("布置婚礼仪式");
    }

    private void after(){
        System.out.println("Thank you for your support!");
        System.out.println("数份子钱");
    }
}
public class StaticProxy {
    public static void main(String[] args) {
        Marry you = new You();
        Marry weddingCompany = new WweddingCompany(you);
        weddingCompany.HappyMarry();

        //对比多线程 Thread类和Runnable接口
        /*
         * Thread类实现了Runnable接口
         */
        new Thread(() -> System.out.println("hello world")).start();

        new WweddingCompany(new You()).HappyMarry();

        /*
         * Thread -》 Runnable
         * new Thread类的时候传入Runnable接口实现类的实例对象
         * 调用Thread的start方法，实际上是在调用Runnable接口实现类的实例对象的run方法，具体干没干其他附加操作，不清楚
         * WeddingsCompany -》 Marry
         * new WweddingCompany类的时候传入Marry接口实现类的实例对象
         * 调用WweddingCompany的HappyMarry方法，实际上是在调用Marry接口实现类的实例对象的HappyMarry方法，只不过是在其执行前后做了一些附加工作
         */
    }
}
